#include<bits/stdc++.h>
using namespace std;
string start;
string ret="12345678x";
unordered_map<string,int> dis;//记录交换之后的状态距离上次的距离
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int bfs()
{
    dis[start]=0;//初始是0
    queue<string> q;
    q.push(start);
    while(!q.empty())
    {
        auto tem=q.front();
        q.pop();
        if(tem==ret)
        {
           return dis[ret];
        }

        int kindex=tem.find('x');
        int cx=kindex/3,cy=kindex%3;
        for(int k=0;k<4;k++)
        {
            int nx=cx+dx[k];
            int ny=cy+dy[k];
            if(nx>=0&&nx<3&&ny>=0&&ny<3)
            {
                
                //用tem2来表示我们交换后的状态tem还是原来没交换的状态
                string tem2=tem;
                //跟新状态
                swap(tem2[kindex],tem2[nx*3+ny]);
                if(!dis.count(tem2))
                {
                    //说明是新的状态
                    q.push(tem2);
                    //此时我们的dismap相当于标记了那个状态已经存在了
                    dis[tem2]=dis[tem]+1;
                }
            }
        }

    }

    return -1;
}


int main()
{
    for(int i=0;i<9;i++)
    {
        char c;
        cin>>c;
        start+=c;
    }
    //cout<<start<<endl;
    cout<<bfs()<<endl;
    return 0;
}